--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
android/app/src/main/java/com/meshchatx/rnode/Esp32SerialFlasher.java e0f1f99cd1c208c5008a936230c38e448dddd45d (e0f1f99c) Text, 14.33 KB
Tff7b72package T7ee787com.meshchatx.rnodeTb4b4b4;
Tff7b72import T7ee787java.io.ByteArrayOutputStreamTb4b4b4;
Tff7b72import T7ee787java.io.IOExceptionTb4b4b4;
Tff7b72import T7ee787java.nio.ByteBufferTb4b4b4;
Tff7b72import T7ee787java.nio.ByteOrderTb4b4b4;
Tff7b72import T7ee787java.security.MessageDigestTb4b4b4;
Tff7b72import T7ee787java.util.LocaleTb4b4b4;
Tff7b72import T7ee787java.util.MapTb4b4b4;
Tff7b72import T7ee787java.util.ArrayListTb4b4b4;
Tff7b72import T7ee787java.util.ArraysTb4b4b4;
Tff7b72import T7ee787java.util.ListTb4b4b4;
T8b949e/**
* Minimal ESP32 ROM bootloader flasher over USB serial (Apache-2.0 protocol).
*
* Implements the subset used by RNode firmware installs: sync, SPI attach,
* baud change, flash begin/data/end, and hard reset via DTR/RTS.
*/
Tff7b72public Tff7b72final Tff7b72class T56d364Esp32SerialFlasher Tb4b4b4{
Tff7b72public Tff7b72interface T56d364Progress Tb4b4b4{
Tffa657void Td2a8ffonStatusTb4b4b4(Te6edf3String Te6edf3messageTb4b4b4)Tb4b4b4;
Tffa657void Td2a8ffonProgressTb4b4b4(Tffa657int Te6edf3percentTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Tff7b72final Tff7b72class T56d364Image Tb4b4b4{
Tff7b72public Tff7b72final Tffa657int Te6edf3addressTb4b4b4;
Tff7b72public Tff7b72final Tffa657byteTff7b72[Tff7b72] Te6edf3dataTb4b4b4;
Tff7b72public Td2a8ffImageTb4b4b4(Tffa657int Te6edf3addressTb4b4b4, Tffa657byteTff7b72[Tff7b72] Te6edf3dataTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3address Tff7b72= Te6edf3addressTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3data Tff7b72= Te6edf3dataTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72static Tff7b72final Tffa657int Te6edf3DEFAULT_TIMEOUT_MS Tff7b72= T79c0ff3000Tb4b4b4;
Tff7b72private Tff7b72static Tff7b72final Tffa657int Te6edf3SYNC_TIMEOUT_MS Tff7b72= T79c0ff100Tb4b4b4;
Tff7b72private Tff7b72static Tff7b72final Tffa657byteTff7b72[Tff7b72] Te6edf3MAGIC_SYNC Tff7b72=
Tff7b72new Tffa657byteTff7b72[Tff7b72] Tb4b4b4{
T79c0ff0x07Tb4b4b4,
T79c0ff0x07Tb4b4b4,
T79c0ff0x12Tb4b4b4,
T79c0ff0x20Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
T79c0ff0x55Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72private Tff7b72static Tff7b72final Tffa657int Te6edf3OP_FLASH_BEGIN Tff7b72= T79c0ff0x02Tb4b4b4;
Tff7b72private Tff7b72static Tff7b72final Tffa657int Te6edf3OP_FLASH_DATA Tff7b72= T79c0ff0x03Tb4b4b4;
Tff7b72private Tff7b72static Tff7b72final Tffa657int Te6edf3OP_FLASH_END Tff7b72= T79c0ff0x04Tb4b4b4;
Tff7b72private Tff7b72static Tff7b72final Tffa657int Te6edf3OP_SYNC Tff7b72= T79c0ff0x08Tb4b4b4;
Tff7b72private Tff7b72static Tff7b72final Tffa657int Te6edf3OP_SPI_ATTACH Tff7b72= T79c0ff0x0dTb4b4b4;
Tff7b72private Tff7b72static Tff7b72final Tffa657int Te6edf3OP_CHANGE_BAUDRATE Tff7b72= T79c0ff0x0fTb4b4b4;
Tff7b72private Tff7b72final Te6edf3UsbSerialHub Te6edf3hubTb4b4b4;
Tff7b72private Tff7b72final Te6edf3Progress Te6edf3progressTb4b4b4;
Tff7b72private Tffa657int Te6edf3sequence Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72public Td2a8ffEsp32SerialFlasherTb4b4b4(Te6edf3UsbSerialHub Te6edf3hubTb4b4b4, Te6edf3Progress Te6edf3progressTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3hub Tff7b72= Te6edf3hubTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3progress Tff7b72= Te6edf3progress Tff7b72!Tff7b72= Tff7b72null Tff7b72? Te6edf3progress Tb4b4b4: Tff7b72new Te6edf3ProgressTb4b4b4(Tb4b4b4) Tb4b4b4{
Tf0883e@Override
Tff7b72public Tffa657void Td2a8ffonStatusTb4b4b4(Te6edf3String Te6edf3messageTb4b4b4) Tb4b4b4{
Tb4b4b4}
Tf0883e@Override
Tff7b72public Tffa657void Td2a8ffonProgressTb4b4b4(Tffa657int Te6edf3percentTb4b4b4) Tb4b4b4{
Tb4b4b4}
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72public Tffa657void Td2a8ffflashTb4b4b4(Te6edf3ListTff7b72<Te6edf3ImageTff7b72> Te6edf3imagesTb4b4b4, Tffa657int Te6edf3flashBaudTb4b4b4) Tff7b72throws Te6edf3IOExceptionTb4b4b4, Te6edf3InterruptedException Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3images Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3imagesTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72throw Tff7b72new Te6edf3IOExceptionTb4b4b4(Ta5d6ff"Ta5d6ffNo firmware images to flashTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3progressTb4b4b4.Te6edf3onStatusTb4b4b4(Ta5d6ff"Ta5d6ffEntering bootloader…Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3enterBootloaderTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3progressTb4b4b4.Te6edf3onStatusTb4b4b4(Ta5d6ff"Ta5d6ffSyncing…Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3syncTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3progressTb4b4b4.Te6edf3onStatusTb4b4b4(Ta5d6ff"Ta5d6ffAttaching SPI flash…Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3spiAttachTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3flashBaud Tff7b72> T79c0ff115200Tb4b4b4) Tb4b4b4{
Te6edf3progressTb4b4b4.Te6edf3onStatusTb4b4b4(Ta5d6ff"Ta5d6ffRaising baud to Ta5d6ff" Tff7b72+ Te6edf3flashBaud Tff7b72+ Ta5d6ff"Ta5d6ff…Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3changeBaudTb4b4b4(Te6edf3flashBaudTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657long Te6edf3totalBytes Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72for Tb4b4b4(Te6edf3Image Te6edf3image Tb4b4b4: Te6edf3imagesTb4b4b4) Tb4b4b4{
Te6edf3totalBytes Tff7b72+Tff7b72= Te6edf3imageTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3lengthTb4b4b4;
Tb4b4b4}
Tffa657long Te6edf3written Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3imagesTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3Image Te6edf3image Tff7b72= Te6edf3imagesTb4b4b4.Te6edf3getTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4;
Te6edf3progressTb4b4b4.Te6edf3onStatusTb4b4b4(
Te6edf3StringTb4b4b4.Te6edf3formatTb4b4b4(
Te6edf3LocaleTb4b4b4.Te6edf3USTb4b4b4,
Ta5d6ff"Ta5d6ffFlashing file %d/%d at 0x%X (%d bytes)…Ta5d6ff"Tb4b4b4,
Te6edf3i Tff7b72+ T79c0ff1Tb4b4b4,
Te6edf3imagesTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3imageTb4b4b4.Te6edf3addressTb4b4b4,
Te6edf3imageTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3length
Tb4b4b4)
Tb4b4b4)Tb4b4b4;
Te6edf3flashImageTb4b4b4(Te6edf3imageTb4b4b4, Te6edf3writtenTb4b4b4, Te6edf3totalBytesTb4b4b4)Tb4b4b4;
Te6edf3written Tff7b72+Tff7b72= Te6edf3imageTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3lengthTb4b4b4;
Te6edf3progressTb4b4b4.Te6edf3onProgressTb4b4b4(Tb4b4b4(Tffa657intTb4b4b4) Te6edf3MathTb4b4b4.Te6edf3minTb4b4b4(T79c0ff100Tb4b4b4, Tb4b4b4(Te6edf3written Tff7b72* T79c0ff100Tb4b4b4) Tff7b72/ Te6edf3MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3totalBytesTb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3progressTb4b4b4.Te6edf3onStatusTb4b4b4(Ta5d6ff"Ta5d6ffFinishing…Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3commandTb4b4b4(Te6edf3OP_FLASH_ENDTb4b4b4, Te6edf3intLeTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3DEFAULT_TIMEOUT_MSTb4b4b4)Tb4b4b4;
Te6edf3progressTb4b4b4.Te6edf3onStatusTb4b4b4(Ta5d6ff"Ta5d6ffResetting device…Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3hardResetTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3progressTb4b4b4.Te6edf3onProgressTb4b4b4(T79c0ff100Tb4b4b4)Tb4b4b4;
Te6edf3progressTb4b4b4.Te6edf3onStatusTb4b4b4(Ta5d6ff"Ta5d6ffFlash completeTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72private Tffa657void Td2a8ffenterBootloaderTb4b4b4(Tb4b4b4) Tff7b72throws Te6edf3IOExceptionTb4b4b4, Te6edf3InterruptedException Tb4b4b4{
T8b949e// Classic ESP auto-reset: RTS=EN, DTR=IO0
Te6edf3hubTb4b4b4.Te6edf3setDtrRtsTb4b4b4(Tff7b72falseTb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Te6edf3ThreadTb4b4b4.Te6edf3sleepTb4b4b4(T79c0ff100Tb4b4b4)Tb4b4b4;
Te6edf3hubTb4b4b4.Te6edf3setDtrRtsTb4b4b4(Tff7b72trueTb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Te6edf3ThreadTb4b4b4.Te6edf3sleepTb4b4b4(T79c0ff100Tb4b4b4)Tb4b4b4;
Te6edf3hubTb4b4b4.Te6edf3setDtrRtsTb4b4b4(Tff7b72falseTb4b4b4, Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3ThreadTb4b4b4.Te6edf3sleepTb4b4b4(T79c0ff50Tb4b4b4)Tb4b4b4;
Te6edf3hubTb4b4b4.Te6edf3setDtrRtsTb4b4b4(Tff7b72falseTb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Te6edf3ThreadTb4b4b4.Te6edf3sleepTb4b4b4(T79c0ff400Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72private Tffa657void Td2a8ffhardResetTb4b4b4(Tb4b4b4) Tff7b72throws Te6edf3IOExceptionTb4b4b4, Te6edf3InterruptedException Tb4b4b4{
Te6edf3hubTb4b4b4.Te6edf3setDtrRtsTb4b4b4(Tff7b72falseTb4b4b4, Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3ThreadTb4b4b4.Te6edf3sleepTb4b4b4(T79c0ff100Tb4b4b4)Tb4b4b4;
Te6edf3hubTb4b4b4.Te6edf3setDtrRtsTb4b4b4(Tff7b72falseTb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Te6edf3ThreadTb4b4b4.Te6edf3sleepTb4b4b4(T79c0ff200Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72private Tffa657void Td2a8ffsyncTb4b4b4(Tb4b4b4) Tff7b72throws Te6edf3IOExceptionTb4b4b4, Te6edf3InterruptedException Tb4b4b4{
Te6edf3IOException Te6edf3last Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3attempt Tff7b72= T79c0ff0Tb4b4b4; Te6edf3attempt Tff7b72< T79c0ff10Tb4b4b4; Te6edf3attemptTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3flushInputTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3commandTb4b4b4(Te6edf3OP_SYNCTb4b4b4, Te6edf3MAGIC_SYNCTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3SYNC_TIMEOUT_MSTb4b4b4)Tb4b4b4;
T8b949e// Drain extra sync responses
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< T79c0ff7Tb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3readResponseTb4b4b4(Te6edf3OP_SYNCTb4b4b4, Te6edf3SYNC_TIMEOUT_MSTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3IOException Te6edf3ignoredTb4b4b4) Tb4b4b4{
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72returnTb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3IOException Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3last Tff7b72= Te6edf3eTb4b4b4;
Te6edf3enterBootloaderTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72throw Te6edf3last Tff7b72!Tff7b72= Tff7b72null Tff7b72? Te6edf3last Tb4b4b4: Tff7b72new Te6edf3IOExceptionTb4b4b4(Ta5d6ff"Ta5d6ffFailed to sync with ESP bootloaderTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72private Tffa657void Td2a8ffspiAttachTb4b4b4(Tb4b4b4) Tff7b72throws Te6edf3IOException Tb4b4b4{
Te6edf3commandTb4b4b4(Te6edf3OP_SPI_ATTACHTb4b4b4, Te6edf3intLeTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3DEFAULT_TIMEOUT_MSTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72private Tffa657void Td2a8ffchangeBaudTb4b4b4(Tffa657int Te6edf3baudTb4b4b4) Tff7b72throws Te6edf3IOExceptionTb4b4b4, Te6edf3InterruptedException Tb4b4b4{
Te6edf3ByteBuffer Te6edf3buf Tff7b72= Te6edf3ByteBufferTb4b4b4.Te6edf3allocateTb4b4b4(T79c0ff8Tb4b4b4)Tb4b4b4.Te6edf3orderTb4b4b4(Te6edf3ByteOrderTb4b4b4.Te6edf3LITTLE_ENDIANTb4b4b4)Tb4b4b4;
Te6edf3bufTb4b4b4.Te6edf3putIntTb4b4b4(Te6edf3baudTb4b4b4)Tb4b4b4;
Te6edf3bufTb4b4b4.Te6edf3putIntTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3commandTb4b4b4(Te6edf3OP_CHANGE_BAUDRATETb4b4b4, Te6edf3bufTb4b4b4.Te6edf3arrayTb4b4b4(Tb4b4b4)Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3DEFAULT_TIMEOUT_MSTb4b4b4)Tb4b4b4;
Te6edf3ThreadTb4b4b4.Te6edf3sleepTb4b4b4(T79c0ff100Tb4b4b4)Tb4b4b4;
Te6edf3hubTb4b4b4.Te6edf3setBaudRateTb4b4b4(Te6edf3baudTb4b4b4)Tb4b4b4;
Te6edf3ThreadTb4b4b4.Te6edf3sleepTb4b4b4(T79c0ff50Tb4b4b4)Tb4b4b4;
Te6edf3flushInputTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72private Tffa657void Td2a8ffflashImageTb4b4b4(Te6edf3Image Te6edf3imageTb4b4b4, Tffa657long Te6edf3alreadyWrittenTb4b4b4, Tffa657long Te6edf3totalBytesTb4b4b4)
Tff7b72throws Te6edf3IOException Tb4b4b4{
Tff7b72final Tffa657int Te6edf3blockSize Tff7b72= T79c0ff0x400Tb4b4b4;
Tffa657int Te6edf3numBlocks Tff7b72= Tb4b4b4(Te6edf3imageTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3length Tff7b72+ Te6edf3blockSize Tff7b72- T79c0ff1Tb4b4b4) Tff7b72/ Te6edf3blockSizeTb4b4b4;
Te6edf3ByteBuffer Te6edf3begin Tff7b72= Te6edf3ByteBufferTb4b4b4.Te6edf3allocateTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4.Te6edf3orderTb4b4b4(Te6edf3ByteOrderTb4b4b4.Te6edf3LITTLE_ENDIANTb4b4b4)Tb4b4b4;
Te6edf3beginTb4b4b4.Te6edf3putIntTb4b4b4(Te6edf3imageTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3lengthTb4b4b4)Tb4b4b4;
Te6edf3beginTb4b4b4.Te6edf3putIntTb4b4b4(Te6edf3numBlocksTb4b4b4)Tb4b4b4;
Te6edf3beginTb4b4b4.Te6edf3putIntTb4b4b4(Te6edf3blockSizeTb4b4b4)Tb4b4b4;
Te6edf3beginTb4b4b4.Te6edf3putIntTb4b4b4(Te6edf3imageTb4b4b4.Te6edf3addressTb4b4b4)Tb4b4b4;
Te6edf3commandTb4b4b4(Te6edf3OP_FLASH_BEGINTb4b4b4, Te6edf3beginTb4b4b4.Te6edf3arrayTb4b4b4(Tb4b4b4)Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3DEFAULT_TIMEOUT_MSTb4b4b4)Tb4b4b4;
Tffa657int Te6edf3seq Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3offset Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72while Tb4b4b4(Te6edf3offset Tff7b72< Te6edf3imageTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3lengthTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3chunkLen Tff7b72= Te6edf3MathTb4b4b4.Te6edf3minTb4b4b4(Te6edf3blockSizeTb4b4b4, Te6edf3imageTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3length Tff7b72- Te6edf3offsetTb4b4b4)Tb4b4b4;
Tffa657byteTff7b72[Tff7b72] Te6edf3block Tff7b72= Te6edf3ArraysTb4b4b4.Te6edf3copyOfRangeTb4b4b4(Te6edf3imageTb4b4b4.Te6edf3dataTb4b4b4, Te6edf3offsetTb4b4b4, Te6edf3offset Tff7b72+ Te6edf3chunkLenTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3blockTb4b4b4.Te6edf3length Tff7b72< Te6edf3blockSizeTb4b4b4) Tb4b4b4{
Te6edf3block Tff7b72= Te6edf3ArraysTb4b4b4.Te6edf3copyOfTb4b4b4(Te6edf3blockTb4b4b4, Te6edf3blockSizeTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3ByteBuffer Te6edf3data Tff7b72= Te6edf3ByteBufferTb4b4b4.Te6edf3allocateTb4b4b4(T79c0ff16 Tff7b72+ Te6edf3blockTb4b4b4.Te6edf3lengthTb4b4b4)Tb4b4b4.Te6edf3orderTb4b4b4(Te6edf3ByteOrderTb4b4b4.Te6edf3LITTLE_ENDIANTb4b4b4)Tb4b4b4;
Te6edf3dataTb4b4b4.Te6edf3putIntTb4b4b4(Te6edf3blockTb4b4b4.Te6edf3lengthTb4b4b4)Tb4b4b4;
Te6edf3dataTb4b4b4.Te6edf3putIntTb4b4b4(Te6edf3seqTb4b4b4)Tb4b4b4;
Te6edf3dataTb4b4b4.Te6edf3putIntTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3dataTb4b4b4.Te6edf3putIntTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3dataTb4b4b4.Te6edf3putTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Tffa657int Te6edf3checksum Tff7b72= T79c0ff0xefTb4b4b4;
Tff7b72for Tb4b4b4(Tffa657byte Te6edf3b Tb4b4b4: Te6edf3blockTb4b4b4) Tb4b4b4{
Te6edf3checksum Tff7b72^Tff7b72= Tb4b4b4(Te6edf3b Tff7b72& T79c0ff0xffTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3commandTb4b4b4(Te6edf3OP_FLASH_DATATb4b4b4, Te6edf3dataTb4b4b4.Te6edf3arrayTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3checksumTb4b4b4, Te6edf3DEFAULT_TIMEOUT_MSTb4b4b4)Tb4b4b4;
Te6edf3seqTff7b72+Tff7b72+Tb4b4b4;
Te6edf3offset Tff7b72+Tff7b72= Te6edf3chunkLenTb4b4b4;
Tffa657long Te6edf3approx Tff7b72= Te6edf3alreadyWritten Tff7b72+ Te6edf3offsetTb4b4b4;
Te6edf3progressTb4b4b4.Te6edf3onProgressTb4b4b4(Tb4b4b4(Tffa657intTb4b4b4) Te6edf3MathTb4b4b4.Te6edf3minTb4b4b4(T79c0ff99Tb4b4b4, Tb4b4b4(Te6edf3approx Tff7b72* T79c0ff100Tb4b4b4) Tff7b72/ Te6edf3MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3totalBytesTb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tffa657byteTff7b72[Tff7b72] Td2a8ffcommandTb4b4b4(Tffa657int Te6edf3opTb4b4b4, Tffa657byteTff7b72[Tff7b72] Te6edf3dataTb4b4b4, Tffa657int Te6edf3checksumTb4b4b4, Tffa657int Te6edf3timeoutMsTb4b4b4) Tff7b72throws Te6edf3IOException Tb4b4b4{
Te6edf3sequence Tff7b72= Tb4b4b4(Te6edf3sequence Tff7b72+ T79c0ff1Tb4b4b4) Tff7b72& T79c0ff0xffTb4b4b4;
Te6edf3ByteBuffer Te6edf3packet Tff7b72= Te6edf3ByteBufferTb4b4b4.Te6edf3allocateTb4b4b4(T79c0ff8 Tff7b72+ Te6edf3dataTb4b4b4.Te6edf3lengthTb4b4b4)Tb4b4b4.Te6edf3orderTb4b4b4(Te6edf3ByteOrderTb4b4b4.Te6edf3LITTLE_ENDIANTb4b4b4)Tb4b4b4;
Te6edf3packetTb4b4b4.Te6edf3putTb4b4b4(Tb4b4b4(Tffa657byteTb4b4b4) T79c0ff0x00Tb4b4b4)Tb4b4b4;
Te6edf3packetTb4b4b4.Te6edf3putTb4b4b4(Tb4b4b4(Tffa657byteTb4b4b4) Te6edf3opTb4b4b4)Tb4b4b4;
Te6edf3packetTb4b4b4.Te6edf3putShortTb4b4b4(Tb4b4b4(Tffa657shortTb4b4b4) Te6edf3dataTb4b4b4.Te6edf3lengthTb4b4b4)Tb4b4b4;
Te6edf3packetTb4b4b4.Te6edf3putIntTb4b4b4(Te6edf3checksumTb4b4b4)Tb4b4b4;
Te6edf3packetTb4b4b4.Te6edf3putTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4;
Te6edf3hubTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3slipEncodeTb4b4b4(Te6edf3packetTb4b4b4.Te6edf3arrayTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3readResponseTb4b4b4(Te6edf3opTb4b4b4, Te6edf3timeoutMsTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72private Tffa657byteTff7b72[Tff7b72] Td2a8ffreadResponseTb4b4b4(Tffa657int Te6edf3expectedOpTb4b4b4, Tffa657int Te6edf3timeoutMsTb4b4b4) Tff7b72throws Te6edf3IOException Tb4b4b4{
Tffa657long Te6edf3deadline Tff7b72= Te6edf3SystemTb4b4b4.Te6edf3currentTimeMillisTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3timeoutMsTb4b4b4;
Te6edf3ByteArrayOutputStream Te6edf3frame Tff7b72= Tff7b72new Te6edf3ByteArrayOutputStreamTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657boolean Te6edf3inFrame Tff7b72= Tff7b72falseTb4b4b4;
Tffa657byteTff7b72[Tff7b72] Te6edf3buf Tff7b72= Tff7b72new Tffa657byteTff7b72[T79c0ff256Tff7b72]Tb4b4b4;
Tff7b72while Tb4b4b4(Te6edf3SystemTb4b4b4.Te6edf3currentTimeMillisTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3deadlineTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3n Tff7b72= Te6edf3hubTb4b4b4.Te6edf3readTb4b4b4(Te6edf3bufTb4b4b4, T79c0ff50Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3n Tff7b72<Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3nTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tffa657int Te6edf3b Tff7b72= Te6edf3bufTff7b72[Te6edf3iTff7b72] Tff7b72& T79c0ff0xffTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3inFrameTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3b Tff7b72=Tff7b72= T79c0ff0xc0Tb4b4b4) Tb4b4b4{
Te6edf3inFrame Tff7b72= Tff7b72trueTb4b4b4;
Te6edf3frameTb4b4b4.Te6edf3resetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3b Tff7b72=Tff7b72= T79c0ff0xc0Tb4b4b4) Tb4b4b4{
Tffa657byteTff7b72[Tff7b72] Te6edf3decoded Tff7b72= Te6edf3slipDecodeTb4b4b4(Te6edf3frameTb4b4b4.Te6edf3toByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3decodedTb4b4b4.Te6edf3length Tff7b72< T79c0ff8Tb4b4b4) Tb4b4b4{
Te6edf3inFrame Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tffa657int Te6edf3direction Tff7b72= Te6edf3decodedTff7b72[T79c0ff0Tff7b72] Tff7b72& T79c0ff0xffTb4b4b4;
Tffa657int Te6edf3op Tff7b72= Te6edf3decodedTff7b72[T79c0ff1Tff7b72] Tff7b72& T79c0ff0xffTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3direction Tff7b72!Tff7b72= T79c0ff0x01 Tff7b72|Tff7b72| Te6edf3op Tff7b72!Tff7b72= Te6edf3expectedOpTb4b4b4) Tb4b4b4{
Te6edf3inFrame Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tffa657int Te6edf3size Tff7b72=
Tb4b4b4(Te6edf3decodedTff7b72[T79c0ff2Tff7b72] Tff7b72& T79c0ff0xffTb4b4b4) Tff7b72| Tb4b4b4(Tb4b4b4(Te6edf3decodedTff7b72[T79c0ff3Tff7b72] Tff7b72& T79c0ff0xffTb4b4b4) Tff7b72<Tff7b72< T79c0ff8Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3decodedTb4b4b4.Te6edf3length Tff7b72< T79c0ff8 Tff7b72+ Te6edf3sizeTb4b4b4) Tb4b4b4{
Te6edf3inFrame Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72continueTb4b4b4;
Tb4b4b4}
T8b949e// status bytes at end of value for ROM protocol
Tff7b72if Tb4b4b4(Te6edf3size Tff7b72>Tff7b72= T79c0ff2Tb4b4b4) Tb4b4b4{
Tffa657int Te6edf3status Tff7b72= Te6edf3decodedTff7b72[T79c0ff8 Tff7b72+ Te6edf3size Tff7b72- T79c0ff2Tff7b72] Tff7b72& T79c0ff0xffTb4b4b4;
Tffa657int Te6edf3error Tff7b72= Te6edf3decodedTff7b72[T79c0ff8 Tff7b72+ Te6edf3size Tff7b72- T79c0ff1Tff7b72] Tff7b72& T79c0ff0xffTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3status Tff7b72!Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72throw Tff7b72new Te6edf3IOExceptionTb4b4b4(
Ta5d6ff"Ta5d6ffESP bootloader error op=0xTa5d6ff"
Tff7b72+ Te6edf3IntegerTb4b4b4.Te6edf3toHexStringTb4b4b4(Te6edf3expectedOpTb4b4b4)
Tff7b72+ Ta5d6ff"Ta5d6ff status=Ta5d6ff"
Tff7b72+ Te6edf3status
Tff7b72+ Ta5d6ff"Ta5d6ff err=Ta5d6ff"
Tff7b72+ Te6edf3error
Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3ArraysTb4b4b4.Te6edf3copyOfRangeTb4b4b4(Te6edf3decodedTb4b4b4, T79c0ff8Tb4b4b4, T79c0ff8 Tff7b72+ Te6edf3sizeTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3frameTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3bTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72throw Tff7b72new Te6edf3IOExceptionTb4b4b4(Ta5d6ff"Ta5d6ffTimeout waiting for ESP response op=0xTa5d6ff" Tff7b72+ Te6edf3IntegerTb4b4b4.Te6edf3toHexStringTb4b4b4(Te6edf3expectedOpTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72private Tffa657void Td2a8ffflushInputTb4b4b4(Tb4b4b4) Tff7b72throws Te6edf3IOException Tb4b4b4{
Tffa657byteTff7b72[Tff7b72] Te6edf3buf Tff7b72= Tff7b72new Tffa657byteTff7b72[T79c0ff512Tff7b72]Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< T79c0ff5Tb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tffa657int Te6edf3n Tff7b72= Te6edf3hubTb4b4b4.Te6edf3readTb4b4b4(Te6edf3bufTb4b4b4, T79c0ff20Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3n Tff7b72<Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72static Tffa657byteTff7b72[Tff7b72] Td2a8ffslipEncodeTb4b4b4(Tffa657byteTff7b72[Tff7b72] Te6edf3dataTb4b4b4) Tb4b4b4{
Te6edf3ByteArrayOutputStream Te6edf3out Tff7b72= Tff7b72new Te6edf3ByteArrayOutputStreamTb4b4b4(Te6edf3dataTb4b4b4.Te6edf3length Tff7b72+ T79c0ff16Tb4b4b4)Tb4b4b4;
Te6edf3outTb4b4b4.Te6edf3writeTb4b4b4(T79c0ff0xc0Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657byte Te6edf3value Tb4b4b4: Te6edf3dataTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3b Tff7b72= Te6edf3value Tff7b72& T79c0ff0xffTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3b Tff7b72=Tff7b72= T79c0ff0xc0Tb4b4b4) Tb4b4b4{
Te6edf3outTb4b4b4.Te6edf3writeTb4b4b4(T79c0ff0xdbTb4b4b4)Tb4b4b4;
Te6edf3outTb4b4b4.Te6edf3writeTb4b4b4(T79c0ff0xdcTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3b Tff7b72=Tff7b72= T79c0ff0xdbTb4b4b4) Tb4b4b4{
Te6edf3outTb4b4b4.Te6edf3writeTb4b4b4(T79c0ff0xdbTb4b4b4)Tb4b4b4;
Te6edf3outTb4b4b4.Te6edf3writeTb4b4b4(T79c0ff0xddTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3outTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3bTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3outTb4b4b4.Te6edf3writeTb4b4b4(T79c0ff0xc0Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3outTb4b4b4.Te6edf3toByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72private Tff7b72static Tffa657byteTff7b72[Tff7b72] Td2a8ffslipDecodeTb4b4b4(Tffa657byteTff7b72[Tff7b72] Te6edf3dataTb4b4b4) Tb4b4b4{
Te6edf3ByteArrayOutputStream Te6edf3out Tff7b72= Tff7b72new Te6edf3ByteArrayOutputStreamTb4b4b4(Te6edf3dataTb4b4b4.Te6edf3lengthTb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3dataTb4b4b4.Te6edf3lengthTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tffa657int Te6edf3b Tff7b72= Te6edf3dataTff7b72[Te6edf3iTff7b72] Tff7b72& T79c0ff0xffTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3b Tff7b72=Tff7b72= T79c0ff0xdb Tff7b72&Tff7b72& Te6edf3i Tff7b72+ T79c0ff1 Tff7b72< Te6edf3dataTb4b4b4.Te6edf3lengthTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3n Tff7b72= Te6edf3dataTff7b72[Tff7b72+Tff7b72+Te6edf3iTff7b72] Tff7b72& T79c0ff0xffTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3n Tff7b72=Tff7b72= T79c0ff0xdcTb4b4b4) Tb4b4b4{
Te6edf3outTb4b4b4.Te6edf3writeTb4b4b4(T79c0ff0xc0Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3n Tff7b72=Tff7b72= T79c0ff0xddTb4b4b4) Tb4b4b4{
Te6edf3outTb4b4b4.Te6edf3writeTb4b4b4(T79c0ff0xdbTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3outTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3bTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3outTb4b4b4.Te6edf3toByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72private Tff7b72static Tffa657byteTff7b72[Tff7b72] Td2a8ffintLeTb4b4b4(Tffa657int Te6edf3valueTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3ByteBufferTb4b4b4.Te6edf3allocateTb4b4b4(T79c0ff4Tb4b4b4)Tb4b4b4.Te6edf3orderTb4b4b4(Te6edf3ByteOrderTb4b4b4.Te6edf3LITTLE_ENDIANTb4b4b4)Tb4b4b4.Te6edf3putIntTb4b4b4(Te6edf3valueTb4b4b4)Tb4b4b4.Te6edf3arrayTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Te6edf3ListTff7b72<Te6edf3ImageTff7b72> Td2a8ffimagesFromZipTb4b4b4(
Tffa657byteTff7b72[Tff7b72] Te6edf3zipBytesTb4b4b4,
Te6edf3MapTff7b72<Te6edf3StringTb4b4b4, Te6edf3StringTff7b72> Te6edf3addressToFilename
Tb4b4b4) Tff7b72throws Te6edf3IOException Tb4b4b4{
Te6edf3ListTff7b72<Te6edf3ImageTff7b72> Te6edf3images Tff7b72= Tff7b72new Te6edf3ArrayListTff7b72<Tff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72try Tb4b4b4(Te6edf3javaTb4b4b4.Te6edf3utilTb4b4b4.Te6edf3zipTb4b4b4.Te6edf3ZipInputStream Te6edf3zis Tff7b72=
Tff7b72new Te6edf3javaTb4b4b4.Te6edf3utilTb4b4b4.Te6edf3zipTb4b4b4.Te6edf3ZipInputStreamTb4b4b4(Tff7b72new Te6edf3javaTb4b4b4.Te6edf3ioTb4b4b4.Te6edf3ByteArrayInputStreamTb4b4b4(Te6edf3zipBytesTb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3javaTb4b4b4.Te6edf3utilTb4b4b4.Te6edf3zipTb4b4b4.Te6edf3ZipEntry Te6edf3entryTb4b4b4;
Te6edf3javaTb4b4b4.Te6edf3utilTb4b4b4.Te6edf3MapTff7b72<Te6edf3StringTb4b4b4, Tffa657byteTff7b72[Tff7b72]Tff7b72> Te6edf3files Tff7b72= Tff7b72new Te6edf3javaTb4b4b4.Te6edf3utilTb4b4b4.Te6edf3HashMapTff7b72<Tff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657byteTff7b72[Tff7b72] Te6edf3buf Tff7b72= Tff7b72new Tffa657byteTff7b72[T79c0ff8192Tff7b72]Tb4b4b4;
Tff7b72while Tb4b4b4(Tb4b4b4(Te6edf3entry Tff7b72= Te6edf3zisTb4b4b4.Te6edf3getNextEntryTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3entryTb4b4b4.Te6edf3isDirectoryTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72continueTb4b4b4;
Tb4b4b4}
Te6edf3String Te6edf3name Tff7b72= Te6edf3entryTb4b4b4.Te6edf3getNameTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657int Te6edf3slash Tff7b72= Te6edf3nameTb4b4b4.Te6edf3lastIndexOfTb4b4b4(Ta5d6ff'/'Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3slash Tff7b72>Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3name Tff7b72= Te6edf3nameTb4b4b4.Te6edf3substringTb4b4b4(Te6edf3slash Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3ByteArrayOutputStream Te6edf3bos Tff7b72= Tff7b72new Te6edf3ByteArrayOutputStreamTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657int Te6edf3nTb4b4b4;
Tff7b72while Tb4b4b4(Tb4b4b4(Te6edf3n Tff7b72= Te6edf3zisTb4b4b4.Te6edf3readTb4b4b4(Te6edf3bufTb4b4b4)Tb4b4b4) Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3bosTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3bufTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3nTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3filesTb4b4b4.Te6edf3putTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3bosTb4b4b4.Te6edf3toByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72for Tb4b4b4(Te6edf3MapTb4b4b4.Te6edf3EntryTff7b72<Te6edf3StringTb4b4b4, Te6edf3StringTff7b72> Te6edf3mapping Tb4b4b4: Te6edf3addressToFilenameTb4b4b4.Te6edf3entrySetTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tffa657int Te6edf3address Tff7b72= Te6edf3IntegerTb4b4b4.Te6edf3decodeTb4b4b4(Te6edf3mappingTb4b4b4.Te6edf3getKeyTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tffa657byteTff7b72[Tff7b72] Te6edf3data Tff7b72= Te6edf3filesTb4b4b4.Te6edf3getTb4b4b4(Te6edf3mappingTb4b4b4.Te6edf3getValueTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3data Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72throw Tff7b72new Te6edf3IOExceptionTb4b4b4(Ta5d6ff"Ta5d6ffMissing firmware file in zip: Ta5d6ff" Tff7b72+ Te6edf3mappingTb4b4b4.Te6edf3getValueTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3imagesTb4b4b4.Te6edf3addTb4b4b4(Tff7b72new Te6edf3ImageTb4b4b4(Te6edf3addressTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e// Flash lower addresses first
Te6edf3imagesTb4b4b4.Te6edf3sortTb4b4b4(Tb4b4b4(Te6edf3aTb4b4b4, Te6edf3bTb4b4b4) Tff7b72-Tff7b72> Te6edf3IntegerTb4b4b4.Te6edf3compareTb4b4b4(Te6edf3aTb4b4b4.Te6edf3addressTb4b4b4, Te6edf3bTb4b4b4.Te6edf3addressTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3imagesTb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Te6edf3String Td2a8ffmd5HexTb4b4b4(Tffa657byteTff7b72[Tff7b72] Te6edf3dataTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3MessageDigest Te6edf3md Tff7b72= Te6edf3MessageDigestTb4b4b4.Te6edf3getInstanceTb4b4b4(Ta5d6ff"Ta5d6ffMD5Ta5d6ff"Tb4b4b4)Tb4b4b4;
Tffa657byteTff7b72[Tff7b72] Te6edf3dig Tff7b72= Te6edf3mdTb4b4b4.Te6edf3digestTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4;
Te6edf3StringBuilder Te6edf3sb Tff7b72= Tff7b72new Te6edf3StringBuilderTb4b4b4(Te6edf3digTb4b4b4.Te6edf3length Tff7b72* T79c0ff2Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657byte Te6edf3b Tb4b4b4: Te6edf3digTb4b4b4) Tb4b4b4{
Te6edf3sbTb4b4b4.Te6edf3appendTb4b4b4(Te6edf3StringTb4b4b4.Te6edf3formatTb4b4b4(Te6edf3LocaleTb4b4b4.Te6edf3USTb4b4b4, Ta5d6ff"Ta5d6ff%02xTa5d6ff"Tb4b4b4, Te6edf3bTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3sbTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3Exception Te6edf3eTb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"Ta5d6ff"Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────